package com.demandbreakdown.xiyun.model.vo.common;


import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.function.Function;

/**
 * 分页响应VO
 *
 * @author poxz
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "分页响应VO")
public class PageVO<T> {

    /**
     * 数据列表
     */
    private List<T> records;

    /**
     * 总记录数
     */
    private Long total;

    /**
     * 当前页码
     */
    private Long current;

    /**
     * 每页大小
     */
    private Long size;

    /**
     * 总页数
     */
    private Long pages;

    /**
     * MyBatis Plus Page 转换为 PageVO
     */
    public static <T> PageVO<T> of(IPage<T> page) {
        return PageVO.<T>builder()
                .records(page.getRecords())
                .total(page.getTotal())
                .current(page.getCurrent())
                .size(page.getSize())
                .pages(page.getPages())
                .build();
    }

    /**
     * MyBatis Plus Page 转换为 PageVO（带数据转换）
     */
    public static <T, R> PageVO<R> of(IPage<T> page, Function<T, R> converter) {
        List<R> records = page.getRecords()
                .stream()
                .map(converter)
                .toList();

        return PageVO.<R>builder()
                .records(records)
                .total(page.getTotal())
                .current(page.getCurrent())
                .size(page.getSize())
                .pages(page.getPages())
                .build();
    }

    /**
     * MyBatis Plus Page 转换为 PageVO（使用已转换的数据列表）
     */
    public static <T, R> PageVO<R> of(IPage<T> page, List<R> convertedRecords) {
        return PageVO.<R>builder()
                .records(convertedRecords)
                .total(page.getTotal())
                .current(page.getCurrent())
                .size(page.getSize())
                .pages(page.getPages())
                .build();
    }
}